package com.samse.plzcallme;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;

public class UserSettingProvider extends ContentProvider {
	public static final String AUTHORITY = "com.samse.plzcallme.provider.Users";

	public static final Uri CONTENT_URI = Uri.parse("content://"+ AUTHORITY + "/user_info");

	public static final String _ID = "_id";
	public static final String PHONE_NUMBER = "phone_number";
	public static final String MATCH_STRING = "match_string";

	private static final int USERS = 1;
	private static final int USER_ID = 2;   

	private static final UriMatcher uriMatcher;
	static {
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		uriMatcher.addURI(AUTHORITY, "user_info", USERS);
		uriMatcher.addURI(AUTHORITY, "user_info/#", USER_ID);      
	}   

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		// arg0 = uri 
		// arg1 = selection
		// arg2 = selectionArgs
		int count=0;
		switch (uriMatcher.match(uri)){
		case USERS:
			count = usersDB.delete(DATABASE_TABLE, selection, selectionArgs);
			break;
		case USER_ID:
			String id = uri.getPathSegments().get(1);
			count = usersDB.delete(DATABASE_TABLE, 
					_ID + " = " + id + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ')' : ""), selectionArgs);
			break;
		default: throw new IllegalArgumentException( "Unknown URI " + uri);    
		}       
		getContext().getContentResolver().notifyChange(uri, null);
		return count;      
	}

	@Override
	public String getType(Uri uri) {
		switch (uriMatcher.match(uri)){
		//---get all books---
		case USERS:
			return "vnd.android.cursor.dir/vnd.samse.plzcallme.users ";
			//---get a particular book---
		case USER_ID:                
			return "vnd.android.cursor.item/vnd.samse.plzcallme.users ";
		default:
			throw new IllegalArgumentException("Unsupported URI: " + uri);        
		}   
		 
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		//---add a new book---
		long rowID = usersDB.insert(
		DATABASE_TABLE, "", values);

		//---if added successfully---
		if (rowID>0) {
			Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);
			getContext().getContentResolver().notifyChange(_uri, null);    
			return _uri;                
		}        
		throw new SQLException("Failed to insert row into " + uri);
	}

	@Override
	public boolean onCreate() {
		Context context = getContext();
		DatabaseHelper dbHelper = new DatabaseHelper(context);
		usersDB = dbHelper.getWritableDatabase();
		return (usersDB == null)? false:true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {

		SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();
		sqlBuilder.setTables(DATABASE_TABLE);

		if (uriMatcher.match(uri) == USER_ID)
		//---if getting a particular book---
		sqlBuilder.appendWhere(	_ID + " = " + uri.getPathSegments().get(1));                

		if (sortOrder==null || sortOrder=="")	sortOrder = PHONE_NUMBER;

		Cursor c = sqlBuilder.query(usersDB, projection, selection, selectionArgs, null, null, sortOrder);

		//---register to watch a content URI for changes---
		c.setNotificationUri(getContext().getContentResolver(), uri);
		return c;
	}


	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		int count = 0;
		switch (uriMatcher.match(uri)){
		case USERS:
			count = usersDB.update(DATABASE_TABLE, values, selection, selectionArgs);
			break;
		case USER_ID:                
			count = usersDB.update(DATABASE_TABLE, values,
					_ID + " = " + uri.getPathSegments().get(1) + (!TextUtils.isEmpty(selection) ? " AND (" + 
							selection + ')' : ""), selectionArgs);
			break;
		default: throw new IllegalArgumentException("Unknown URI " + uri);    
		}       
		getContext().getContentResolver().notifyChange(uri, null);
		return count;
	}

	private SQLiteDatabase usersDB;
	private static final String DATABASE_NAME = "Users";
	private static final String DATABASE_TABLE = "user_table";
	private static final int DATABASE_VERSION = 1;
	private static final String DATABASE_CREATE =
		"create table " + DATABASE_TABLE + 
		" (_id integer primary key autoincrement, "
		+ "phone_number text not null, match_string text not null);";

	private static class DatabaseHelper extends SQLiteOpenHelper {
		DatabaseHelper(Context context) {
			super(context, DATABASE_NAME, null, DATABASE_VERSION);
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(DATABASE_CREATE);
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			Log.w("Content provider database", 
			"Upgrading database from version " + 
			oldVersion + " to " + newVersion + 
			", which will destroy all old data");
			db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
			onCreate(db);
		}
	}   

}
